package com.snap.vseries.analyze;

import org.apache.commons.math3.fitting.leastsquares.ParameterValidator;
import org.apache.commons.math3.linear.RealVector;

/**
 * android developer 的调参之路
 * 调参工程师。。。
 */
public final class AnalyzeParams {

    //============线性拟合使用的：============
    //是否扩增的斜率临界值
    public static final double AMP_SLOPE_THRESHOLD = 2E-3;
    //直线拟合前n个不参与
    public static final int LINE_FIT_PRE_EXCLUDE = 3;
    //============双S拟合使用的：============
    //是否扩增的afi临界值
    public static final double AMP_AFI_THRESHOLD = 0.3;  //0.3 还是0.2 是个问题啊
    //负斜率临界值(双S拟合后 过滤异常参数）
    public static final double AMP_SIGMOID_SLOPE_THRESHOLD = -0.03;
    //牛顿迭代法求值时 最大评价次数
    public static final int SOLVER_MAX_EVAL = 100;
    private static final String TAG = "AnalyzeParams";

    public static class MyParameterValidator implements ParameterValidator {

        //参数修正器中的修正范围
        final int minLimit = 1;
        final int maxLimit = 50;

        @Override
        public RealVector validate(RealVector params) {
            double p3 = params.getEntry(3);
            if (p3 > 1.0) {
                params.setEntry(3, 1.0);
            } else if (p3 < 0) {
                params.setEntry(3, 0.1);
            }

            double p5 = params.getEntry(5);
            if (p5 > 1.0) {
                params.setEntry(5, 1.0);
            } else if (p5 < 0) {
                params.setEntry(5, 0.1);
            }

            double p4 = params.getEntry(4);
            if (p4 > maxLimit) {
                params.setEntry(4, maxLimit);
            } else if (p4 < minLimit) {
                params.setEntry(4, minLimit);
            }

            double p6 = params.getEntry(6);
            if (p6 > maxLimit) {
                params.setEntry(6, maxLimit);
            } else if (p6 < minLimit) {
                params.setEntry(6, minLimit);
            }
            return params;
        }
    }
}
